package cn.ecut.tbjie.utils;


import java.util.*;

/**
 * 用户核心码生成器(128位内不重复随机数生成器）
 *
 * 注意：一个对象只能使用一次；
 */
public class GenerateRNum {

    private ArrayList<Integer> a = new ArrayList();


    public GenerateRNum(){
        for (int i = 0; i < 128; i++) {
            a.add(i);
        }
    }
    public int[] getRArray(int size) {

        int[] num = new int[size];
        for (int i = 0; i < size; i++) {
            int random = (int) (Math.random() * (128 - i));
            num[i] = a.remove(random);
        }
        return num;
    }

    /**
     * 该方法还有bug，已知末段区间未选择，可能出现越界或空指针异常。
     */

//    public int[] getRArray(int size, int range) {
//        /**
//         * 由 生成随机数后产生的和初始值的差值 组成的数组
//         */
//        ArrayList<Integer> difference = new ArrayList<>();
//        /**
//         * 生成的 不重复的 随机数 组成的数组
//         */
//        int[] rArray = new int[size];
//
//        /**
//         * 接收 differentNum() 方法 返回的数组
//         */
//        int[] ints = new int[2];
//        rArray[0] = (int) (range * Math.random());
//        ints = differentNum(rArray[0],range-1,difference);
//        rArray[1] = ints[0];
//        difference.add(ints[1]);
//        for (int i = 2; i < size; i++) {
//            ints = differentNum(rArray[0],range-1,difference);
//            rArray[i] = ints[0];
//            difference.add(ints[1]);
//        }
//        return rArray;
//    }
//
//    /**
//     * 在一定范围内生成排除指定整数的伪随机数
//     *
//     * @param initialNum 初始值
//     * @param range      范围（[0,range]）
//     * @param exclude    可变长参数，填入需要排除的数和初始值的差值(若为负数，则加上range + 1）。
//     * @return 符合条件的值以及初始值与该值的差值(若为负数 ， 则加上range + 1) 。
//     */
//    private int[] differentNum(int initialNum, int range, ArrayList<Integer> exclude) {
//        /**
//         * a[0]: 存放的是生成的随机数
//         * a[1]: 存放的是该随机数与初始值之间的差值(若为负数 ， 则加上range + 1 ) ；
//         */
//        int[] a = new int[2];
//
//
//        if (exclude != null && exclude.size() != 0) {
//
//            if(exclude.size() > 1){
//                exclude.sort((o1, o2) -> o1 - o2);
//            }
//
//            /**
//             *用来存放 已选数 之间的 差值 （以下称为差值） 的集合
//             */
//            List<Integer> list = new ArrayList();
//
//            /**
//             * 如果最小的
//             */
//            if (exclude.get(0) != 1) {
//                list.add(0);
//            }
//            for (int i = 1; i < exclude.size(); i++) {
//                if ((exclude.get(i) - exclude.get(i-1)) != 1) {
//                    list.add(i);
//                }
//            }
//            Integer subscript = list.get((int) (list.size() * Math.random()));
//            if (subscript != 0) {
//                int length = exclude.get(subscript) - exclude.get(subscript - 1) - 1;
//                a[1] = (int) (length * Math.random()) + 1 + exclude.get(subscript - 1);
//            } else {
//                int length = exclude.get(subscript) - 1;
//                a[1] = (int) (length * Math.random()) + 1;
//            }
//            a[0] = (a[1] + initialNum) % (range + 1);
//        } else {
//            a[0] = ((((int) ((range) * Math.random()) + 1) + (initialNum)) % (range + 1));
//            a[1] = a[0] - initialNum;
//            a[1] = a[1] > 0 ? a[1] : (a[1] + range + 1);
//        }
//        return a;
//    }
}
